home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 7 / Night Owl Shareware (NOPV7)(Night Owl Publisher Inc.)(1992).bin / 038a / bash1_12.arj / BASH1-12.TAR / bash-1.12 / builtins / wait.def < prev   
Text File  |  1991-10-30  |  4KB  |  134 lines

  1. This file is wait.def, from which is created wait.c.
  2. It implements the builtin "wait" in Bash.
  3.  
  4. Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
  5.  
  6. This file is part of GNU Bash, the Bourne Again SHell.
  7.  
  8. Bash is free software; you can redistribute it and/or modify it under
  9. the terms of the GNU General Public License as published by the Free
  10. Software Foundation; either version 1, or (at your option) any later
  11. version.
  12.  
  13. Bash is distributed in the hope that it will be useful, but WITHOUT ANY
  14. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  16. for more details.
  17.  
  18. You should have received a copy of the GNU General Public License along
  19. with Bash; see the file COPYING.  If not, write to the Free Software
  20. Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22.  
  23. $BUILTIN wait
  24. $FUNCTION wait_builtin
  25. $DEPENDS_ON JOB_CONTROL
  26. $PRODUCES wait.c
  27. $SHORT_DOC wait [n]
  28. Wait for the specified process and report its termination status.  If
  29. N is not given, all currently active child processes are waited for,
  30. and the return code is zero.  N may be a process ID or a job
  31. specification; if a job spec is given, all processes in the job's
  32. pipeline are waited for.
  33. $END
  34.  
  35. $BUILTIN wait
  36. $FUNCTION wait_builtin
  37. $DEPENDS_ON !JOB_CONTROL
  38. $SHORT_DOC wait [n]
  39. Wait for the specified process and report its termination status.  If
  40. N is not given, all currently active child processes are waited for,
  41. and the return code is zero.  N is a process ID; if it is not given,
  42. all child processes of the shell are waited for.
  43. $END
  44.  
  45. #include <sys/types.h>
  46. #include <signal.h>
  47. #include "../shell.h"
  48. #include "../jobs.h"
  49. #if defined (JOB_CONTROL)
  50. extern int job_control;
  51. #endif /* JOB_CONTROL */
  52.  
  53. /* Wait for the pid in LIST to stop or die.  If no arguments are given, then
  54.    wait for all of the active background processes of the shell and return
  55.    0.  If a list of pids or job specs are given, return the exit status of
  56.    the last one waited for. */
  57. wait_builtin (list)
  58.      WORD_LIST *list;
  59. {
  60.   extern void wait_for_background_pids ();
  61.   extern int wait_for_single_pid ();
  62.   extern int interrupt_immediately;
  63.   int status = EXECUTION_SUCCESS;
  64.  
  65.   begin_unwind_frame ("wait_builtin");
  66.   unwind_protect_int (interrupt_immediately);
  67.   interrupt_immediately++;
  68.  
  69.   /* We support jobs or pids.
  70.      wait <pid-or-job> [pid-or-job ...] */
  71.  
  72.   /* But wait without any arguments means to wait for all of the shell's
  73.      currently active background processes. */
  74.   if (!list)
  75.     {
  76.       wait_for_background_pids ();
  77.       status = EXECUTION_SUCCESS;
  78.       goto return_status;
  79.     }
  80.  
  81.   while (list)
  82.     {
  83.       pid_t pid;
  84.       if (digit (*(list->word->word)))
  85.     {
  86.       if (sscanf (list->word->word, "%d", &pid) == 1)
  87.         status = wait_for_single_pid (pid);
  88.       else
  89.         {
  90.           builtin_error
  91.         ("`%s' is not a pid or job spec", list->word->word);
  92.           status = EXECUTION_FAILURE;
  93.           goto return_status;
  94.         }
  95.     }
  96. #if defined (JOB_CONTROL)
  97.       else if (job_control)
  98.     /* Must be a job spec.  Check it out. */
  99.     {
  100.       int job;
  101.       sigset_t set, oset;
  102.  
  103.       BLOCK_CHILD (set, oset);
  104.       job = get_job_spec (list);
  105.  
  106.       if (job < 0 || job >= job_slots || !jobs[job])
  107.         {
  108.           if (job != DUP_JOB)
  109.         builtin_error ("No such job %s", list->word->word);
  110.           UNBLOCK_CHILD (oset);
  111.           status = EXECUTION_FAILURE;
  112.           list = list->next;
  113.           continue;
  114.         }
  115.  
  116.       /* Job spec used.  Wait for the last pid in the pipeline. */
  117.       UNBLOCK_CHILD (oset);
  118.       status = wait_for_job (job);
  119.     }
  120. #endif /* JOB_CONTROL */
  121.       else
  122.     {
  123.       builtin_error ("%s is not a pid or legal job spec",
  124.              list->word->word);
  125.       status = EXECUTION_FAILURE;
  126.     }
  127.       list = list->next;
  128.     }
  129.  return_status:
  130.   run_unwind_frame ("wait_builtin");
  131.   return (status);
  132. }
  133.  
  134.